# -*- coding: utf-8 -*-
import os
import pandas as pd
import json
import logging
from openai import OpenAI
import shutil

# 配置日志
logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')

# 初始化 DeepSeek 客户端
client = OpenAI(api_key="sk-5uqqDiWSWxEXjjQkN28yazPbb7pWjH7ZosrJbCZpSj5ryaYK", base_url="https://tbnx.plus7.plus/v1")

def get_relevant_points(points, content):
    """
    获取给定评论的相关知识点。
    :param points: 'point' 列中的知识点文本
    :param content: 评论内容
    :return: 相关知识点编号的列表
    """
    # 构建提示信息
    prompt = f"""
以下是背景对应的知识点：
{points}

评论：{content}

请判断哪些知识点与评论相关，并列出相关的知识点编号。只输出编号，不要输出其他信息。
"""
    try:
        # 记录调用 DeepSeek API 的信息
        logging.info(f"{prompt}")

        # 调用 DeepSeek API
        response = client.chat.completions.create(
            model="deepseek-chat",
            messages=[
                {"role": "system", "content": "你是一个协助进行知识点分析的助手。"},
                {"role": "user", "content": prompt},
            ],
            stream=False
        )

        # 提取返回结果
        result = response.choices[0].message.content.strip()
        # 去掉 <think> 标签及其中内容
        if "<think>" in result:
            start_index = result.find("<think>")
            end_index = result.find("</think>") + len("</think>")
            result = result[:start_index] + result[end_index:]
            # 去掉换行符
        result = result.replace('\n', ' ')

        # 记录 DeepSeek API 的返回结果
        logging.info(f"DeepSeek API 返回结果：{result}")

        # 从结果中提取相关知识点的编号
        relevant_indices = []
        # 先去除方括号及其内部内容
        cleaned_result = result.split('[')[0]

        # 去除cleaned_result中的所有空格
        cleaned_result = cleaned_result.replace(" ", "")
        for part in cleaned_result.split(','):
            part = part.strip()
            if part.isdigit():
                relevant_indices.append(int(part))

        return relevant_indices

    except Exception as e:
        # 记录调用 DeepSeek API 时出现的错误
        logging.error(f"调用 DeepSeek API 时出错：{e}")
        return []

def process_excel(input_file, output_file):
    """
    处理 Excel 文件，添加一个包含相关知识点的新列。
    :param input_file: 输入 Excel 文件的路径
    :param output_file: 输出 Excel 文件的路径
    """
    # 读取 Excel 文件
    df = pd.read_excel(input_file)

    # 初始化新列
    df['relevant_points'] = None

    # 初始化计数器
    count = 0

    # 每隔多少条数据备份一次
    backup_interval = 50

    # 每处理完多少条数据保存一次
    save_interval = 10

    # 处理每一行
    for index, row in df.iterrows():
        points = row['point']  # 直接从 'point' 列获取知识点文本
        content = row['content']

        # 获取相关知识点
        relevant_points = get_relevant_points(points, content)

        # 更新 DataFrame
        df.at[index, 'relevant_points'] = ', '.join(map(str, relevant_points))

        # 每处理完一条数据，计数器加1
        count += 1

        # 每处理完 save_interval 条数据保存一次
        if count % save_interval == 0:
            df.to_excel(output_file, index=False)
            logging.info(f"数据已保存，当前处理到索引: {index}")

        # 每隔 backup_interval 条数据备份一次
        if count % backup_interval == 0:
            backup_file = os.path.splitext(output_file)[0] + f"_backup_{index}.xlsx"
            shutil.copy(output_file, backup_file)
            logging.info(f"备份已保存，当前处理到索引: {index}，备份文件: {backup_file}")

    # 最后保存一次，确保所有数据都被保存到文件中
    df.to_excel(output_file, index=False)
    logging.info(f"处理后的数据已保存到 {output_file}")

# 主执行部分
if __name__ == "__main__":
    input_file = r"C:\Users\23248\PycharmProjects\stance\DataCrawler\data\tot_data_with_points.xlsx"  # 替换为你的输入文件路径
    output_file = r"C:\Users\23248\PycharmProjects\stance\DataCrawler\data\tot_data_output_data2.xlsx"  # 替换为你想要的输出文件路径
    process_excel(input_file, output_file)